package com.kclm.se.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public interface ProxyFactory {

	/*****
	 * 利用JDK的proxy来生成目上标对象的代理对象
	 * @param target
	 * @return
	 */
	@SuppressWarnings("unchecked")
	static <T> T getProxyInstance(T target) {
		//注：如果目标对象没有实现接口，则此方法会抛出异常
		return (T)Proxy.newProxyInstance(
				target.getClass().getClassLoader(), //获取目标对象的类加载器
				target.getClass().getInterfaces(),  //获取目标对象所实现的接口类型 
				(proxy, method, args) -> {          //使用JDK8的Lambda表达式
					//
					System.out.println("目标方法调用前：开始事务");
					//执行目标方法
					Object rtnValue = method.invoke(target, args);
					System.out.println("目标方法调用后：结束事务");
					//
					return rtnValue;
				}
				/*new InvocationHandler() {
					
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.println("目标方法调用前：开始事务");
						//执行目标方法
						Object rtnValue = method.invoke(target, args);
						System.out.println("目标方法调用后：结束事务");
						//
						return rtnValue;
					}
				}*/
				);
	}
}
